#ifndef CVCALIBRATEGUI_H
#define CVCALIBRATEGUI_H

#include <gtkmm.h>
#include <libglademm.h>
#include <libglademm/xml.h>
#include <iostream>
#include <gdkmm/pixbuf.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include "cvcamera.h"
#include <sstream>

/** \file cvcalibrategui.h
 */

namespace bottracker {

class CvCalibrateGUI : public Gtk::Window
{
    public:
    /** \brief konstruktor
     *
     * @param base_object
     * @param glade_xml plik Glade z opisem interfejsu
     */
        CvCalibrateGUI( BaseObjectType* base_object,
                        const Glib::RefPtr<Gnome::Glade::Xml>& glade_xml );
    /** \brief destruktor
     */
        virtual ~CvCalibrateGUI();
    /** \brief wywołuje funkcję pobierającą kolejną klatkę
     */
        void button_grab_frame_clicked();
    /** \brief zapisuje uzyskane paramtry do pliku
     */
        void button_save_clicked();
    /** \brief kalibracja kamery
     */
        void button_calibrate_clicked();
    /** \brief zamyka okno kalibracji
     */
        void button_close_clicked();
    /** \brief Metode wyświetlająca obraz z kamery
	 *
	 * Matoda wykorzystuje Glib::signal_idle() do wyświetlania obrazu z kamery
	 * bez zamrażania GUI.
	 */
		bool on_timer();
    /** \brief metoda konwertująca integer do ustring
     *
     * tylko ustring może być wyświetlony w GtkEntry
     * @param v integer do przekształcenia
     * return
     */
// TODO (bolek#1#): Sprawdzić czy nie wystarczy double2ustring - automatyczna promocja inych typów do double        Glib::ustring int2ustring(int v) {std::stringstream sstr;sstr << v;Glib::ustring ustr = sstr.str();return ustr;}
    /** \brief metoda konwertująca double do ustring
     *
     * tylko ustring może być wyświetlony w GtkEntry
     * @param v double do przekształcenia
     * return
     */
        Glib::ustring double2ustring(double v) {std::stringstream sstr;sstr << v;Glib::ustring ustr = sstr.str();return ustr;}
    /** \brief obsługa spinbuttonów, uruchamiająca cały proces kalibracji
     *
     */
        void spinbutton_value_changed();
    private:
        static const int DELAY = 300;
        static const int WIDTH = 640;
        static const int HEIGHT = 480;
        Gtk::Window* pm_CalibWin;                   ///< Wskaźnik do każdego widgetu z pliku Glade.
		Gtk::Button* pm_ButtonGrab;
		Gtk::Button* pm_ButtonCalibrate;
        Gtk::Button* pm_ButtonSave;
		Gtk::Button* pm_ButtonClose;
		Gtk::Image* pm_ImageCalibLive;
		Gtk::SpinButton* pm_SpinbuttonSize;
		Gtk::SpinButton* pm_SpinbuttonCornersX;
		Gtk::SpinButton* pm_SpinbuttonCornersY;
		Gtk::Label* pm_LabelGrabbed;
		Gtk::MessageDialog* pm_ErrDialog;
		Gtk::Entry* pm_EntryFocal1;
		Gtk::Entry* pm_EntryFocal2;
		Gtk::Entry* pm_EntryPrincipal1;
		Gtk::Entry* pm_EntryPrincipal2;
		Gtk::Entry* pm_EntryMat11;
		Gtk::Entry* pm_EntryMat12;
		Gtk::Entry* pm_EntryMat13;
		Gtk::Entry* pm_EntryMat21;
		Gtk::Entry* pm_EntryMat22;
		Gtk::Entry* pm_EntryMat23;
		Gtk::Entry* pm_EntryMat31;
		Gtk::Entry* pm_EntryMat32;
		Gtk::Entry* pm_EntryMat33;
		Gtk::Entry* pm_EntryDist1;
		Gtk::Entry* pm_EntryDist2;
		Gtk::Entry* pm_EntryDist3;
		Gtk::Entry* pm_EntryDist4;
		Glib::Mutex pm_Mutex;
		Glib::Dispatcher pm_SignalFinished;
		CvCapture* pm_Capture;
		IplImage* pm_Frame;
		CvCamera* pm_Cam;
		CvPoint2D32f* pm_CornersFound;              // tymczasowa tablica do wykrywania i rysowania wykrytych wierzchołków live
		int pm_CornersCount;                        // ditto licza znalezionych wierzchołków
};


}
#endif // CVCALIBRATEGUI_H
